// File: jmcomic-core/src/main/java/dev/jukomu/common/util/Asserts.java
package dev.jukomu.common.util;

import java.util.Collection;
import java.util.Map;
import java.util.function.Consumer;

public class Asserts {

    /**
     * 断言两个对象相等。
     *
     * @param raw     实际值
     * @param correct 期望值
     * @param <T>     对象类型
     * @return 如果相等返回 true，否则返回 false
     */
    public static <T> boolean assertEquals(T raw, T correct) {
        return raw != null ? raw.equals(correct) : correct == null;
    }

    /**
     * 断言两个对象相等，如果相等则执行回调。
     *
     * @param raw              实际值
     * @param correct          期望值
     * @param callbackWhenTrue 相等时执行的回调
     * @param args             回调函数的参数
     * @param <T>              对象类型
     * @return 如果相等返回 true，否则返回 false
     */
    public static <T> boolean assertEquals(T raw, T correct, Consumer<Object[]> callbackWhenTrue, Object... args) {
        boolean isSuccess = assertEquals(raw, correct);
        if (isSuccess && callbackWhenTrue != null) {
            callbackWhenTrue.accept(args);
        }
        return isSuccess;
    }

    // 移除 BiConsumer 的重载版本，因为 kwargs 在这里没有直接意义。
    // 如果需要传递 Map 参数，回调函数本身可以设计为接收 Map。

    /**
     * 检查集合中是否存在任何匹配项。
     *
     * @param raw      原始字符串
     * @param accepted 可接受的字符串集合
     * @return 如果存在任何匹配项返回 true，否则返回 false
     */
    public static boolean anyMatch(String raw, Collection<String> accepted) {
        return accepted.stream().anyMatch(raw::contains);
    }

    /**
     * 检查集合中是否存在任何匹配项，如果匹配则执行回调。
     *
     * @param raw              原始字符串
     * @param accepted         可接受的字符串集合
     * @param callbackWhenTrue 匹配时执行的回调
     * @param args             回调函数的参数
     * @return 如果存在任何匹配项返回 true，否则返回 false
     */
    public static boolean anyMatch(String raw, Collection<String> accepted, Consumer<Object[]> callbackWhenTrue, Object... args) {
        boolean isSuccess = anyMatch(raw, accepted);
        if (isSuccess && callbackWhenTrue != null) {
            callbackWhenTrue.accept(args);
        }
        return isSuccess;
    }

    // 移除 BiConsumer 的重载版本

    /**
     * 要求对象非空（对于集合和Map，要求非空且非零大小）。
     *
     * @param obj 要检查的对象
     * @throws IllegalArgumentException 如果对象为空或集合/Map为空
     */
    public static void requireNotEmpty(Object obj) {
        if (obj == null) {
            throw new IllegalArgumentException("Parameter cannot be null.");
        }
        if (obj instanceof String && ((String) obj).isEmpty()) {
            throw new IllegalArgumentException("String parameter cannot be empty.");
        }
        if (obj instanceof Collection && ((Collection<?>) obj).isEmpty()) {
            throw new IllegalArgumentException("Collection parameter cannot be empty.");
        }
        if (obj instanceof Map && ((Map<?, ?>) obj).isEmpty()) {
            throw new IllegalArgumentException("Map parameter cannot be empty.");
        }
        // 可以根据需要添加其他类型的检查
    }

    /**
     * 要求表达式为真，否则抛出 AssertionError。
     *
     * @param expression   要检查的布尔表达式
     * @param errorMessage 错误消息
     * @throws AssertionError 如果表达式为假
     */
    public static void requireTrue(boolean expression, String errorMessage) {
        if (!expression) {
            throw new AssertionError(errorMessage);
        }
    }

    /**
     * 调用一个接受Object[]参数的函数。
     *
     * @param func 要调用的函数
     * @param args 函数的参数
     */
    public static void callFunc(Consumer<Object[]> func, Object... args) {
        if (func != null) {
            func.accept(args);
        }
    }
}